// 数据库配置模块
// 管理 SurrealDB 连接配置

use serde::{Deserialize, Serialize};
use std::path::PathBuf;

/// 数据库配置
/// 
/// 用于配置 SurrealDB 嵌入式数据库的存储路径和连接参数
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DbConfig {
    /// 数据库文件存储路径
    pub path: PathBuf,
    
    /// 命名空间
    pub namespace: String,
    
    /// 数据库名称
    pub database: String,
}

impl Default for DbConfig {
    fn default() -> Self {
        Self {
            path: PathBuf::from("./data/akoption.db"),
            namespace: "akoption".to_string(),
            database: "options".to_string(),
        }
    }
}

impl DbConfig {
    /// 创建新的数据库配置
    /// 
    /// # 参数
    /// 
    /// * `path` - 数据库文件路径
    /// * `namespace` - 命名空间
    /// * `database` - 数据库名称
    /// 
    /// # 示例
    /// 
    /// ```rust,no_run
    /// use akoption::db::DbConfig;
    /// use std::path::PathBuf;
    /// 
    /// let config = DbConfig::new(
    ///     PathBuf::from("./my_data/options.db"),
    ///     "my_namespace",
    ///     "my_database"
    /// );
    /// ```
    pub fn new(path: PathBuf, namespace: impl Into<String>, database: impl Into<String>) -> Self {
        Self {
            path,
            namespace: namespace.into(),
            database: database.into(),
        }
    }
    
    /// 使用默认配置但指定自定义路径
    /// 
    /// # 参数
    /// 
    /// * `path` - 数据库文件路径
    /// 
    /// # 示例
    /// 
    /// ```rust,no_run
    /// use akoption::db::DbConfig;
    /// use std::path::PathBuf;
    /// 
    /// let config = DbConfig::with_path(PathBuf::from("./custom/path/db"));
    /// ```
    pub fn with_path(path: PathBuf) -> Self {
        Self {
            path,
            ..Default::default()
        }
    }
    
    /// 获取数据库连接字符串
    /// 
    /// 返回 SurrealDB 的 RocksDB 连接字符串
    pub fn connection_string(&self) -> String {
        format!("rocksdb://{}", self.path.display())
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    
    #[test]
    fn test_default_config() {
        let config = DbConfig::default();
        assert_eq!(config.namespace, "akoption");
        assert_eq!(config.database, "options");
    }
    
    #[test]
    fn test_custom_config() {
        let config = DbConfig::new(
            PathBuf::from("/tmp/test.db"),
            "test_ns",
            "test_db"
        );
        assert_eq!(config.namespace, "test_ns");
        assert_eq!(config.database, "test_db");
    }
    
    #[test]
    fn test_connection_string() {
        let config = DbConfig::with_path(PathBuf::from("./data/test.db"));
        let conn_str = config.connection_string();
        assert!(conn_str.starts_with("rocksdb://"));
    }
}
